package br.com.er2.utils.socket.xml
{
	import br.com.er2.utils.hash.HashMap;

	import flash.xml.XMLDocument;

	import mx.collections.ArrayCollection;
	import mx.rpc.xml.SimpleXMLDecoder;
	import mx.utils.ObjectUtil;
	import mx.utils.StringUtil;

	import spark.globalization.StringTools;

	public class PacoteXML
	{
		public static const VERSION:int=1;

		private var _comando:String;
		private var _parametros:HashMap=null;


		public function PacoteXML()
		{
			_parametros=new HashMap();
		}

		public function set comando(value:String):void
		{
			this._comando=value;
		}

		public function get comando():String
		{
			return this._comando;
		}

		public function addParametro(nome:String, valor:Object):void
		{
			if (_parametros.containsKey(nome))
			{
				_parametros.remove(nome);
			}
			_parametros.put(nome, valor);
		}

		public function removeParametro(nome:String):void
		{
			_parametros.remove(nome);
		}

		public function getParametro(nome:String):Object
		{
			return _parametros.getValue(nome);
		}

		public function getParametros():Array
		{
			return _parametros.getAllKeys();
		}

		public function toXML():String
		{
			var result:String="";
			var i:int=0;
			var temp:Array=_parametros.getAllKeys();
			try
			{
				result+='<pacote>\n'
				result+='    <comando nome="' + comando + '">\n';
				for (i=0; i < temp.length; i++)
				{
					result+='        <parametro nome="' + temp[i] + '">' + ObjectUtil.toString(getParametro(temp[i])) + '</parametro>\n';
				}
				result+="    </comando>\n";
				result+="</pacote>";

			}
			finally
			{
				i=null;
				temp=null;
			}
			return result;
		}

		private function clear():void
		{
			this.comando="";
			var i:int=0;
			var temp:Array=_parametros.getAllKeys();
			for (i=0; i < temp.length; i++)
			{
				this.removeParametro(getParametro(temp[i]).toString());
			}
		}

		public function fromXML(xml:String):void
		{
			var xmlDoc:XMLDocument=new XMLDocument(xml);
			var decoder:SimpleXMLDecoder=new SimpleXMLDecoder(true);
			var obj:Object=decoder.decodeXML(xmlDoc);
			
			clear();

			comando=obj.pacote.comando.nome;
			for (var i:int=0; i < ArrayCollection(obj.pacote.comando.parametro).length; i++)
			{
				addParametro(ArrayCollection(obj.pacote.comando.parametro).getItemAt(i).nome, ArrayCollection(obj.pacote.comando.parametro).getItemAt(i).value);
			}
		}
	}
}
